package main

import "fmt"

type (
	Info struct {
		AvgTTL       int64
		MaxTTL       int64
		Name string
	}

	ObjectA struct {
		Callback func() Info  // 回调函数
	}

	ObjectMgr struct {
		Value int64
		Name string
		RealObj * ObjectA
	}
)

// 被回调的函数
func (o *ObjectMgr) getInfo() Info {
	return Info{
		AvgTTL: o.Value,
		MaxTTL: 2,
		Name: o.Name,
	}
}

func createMgr() *ObjectMgr {
	var callback func() Info // 1. 先定义一个临时变量
	var ret = &ObjectMgr{
		Value : 32,
		Name: "test",
		RealObj: &ObjectA{
			Callback: func() Info { // 2. 构造一个闭包
				ret := callback()  // 闭包内引用外部局部变量callback, 只不过callback是一个函数
				fmt.Printf("Call ObjectA callback ret=%v,\n", ret)
				return ret
			},
		},
	}
	// 对局部变量(callback)的修改实际是对上述闭包 ret := callback() 中的callback的修改
	callback = ret.getInfo
	return ret
}

func main()  {
	obj := createMgr()
	obj.RealObj.Callback() // 实际执行的是闭包函数， 调用obj.getInfo函数生成对象给ret,然后打印输出
}
